using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;

namespace PatentAssistant.Services
{
    public class ChatMessage
    {
        public string role { get; set; } = string.Empty;
        public string content { get; set; } = string.Empty;
    }

    public class ChatRequest
    {
        public string model { get; set; } = string.Empty;
        public List<ChatMessage> messages { get; set; } = new List<ChatMessage>();
        public double temperature { get; set; }
        public bool stream { get; set; }
    }

    public class ChatChoice
    {
        public ChatMessage? message { get; set; }
        public Delta? delta { get; set; }
    }

    public class Delta
    {
        public string content { get; set; } = string.Empty;
    }

    public class ChatResponse
    {
        public List<ChatChoice> choices { get; set; } = new List<ChatChoice>();
        public Usage? usage { get; set; }
    }

    public class Usage
    {
        public int total_tokens { get; set; }
    }

    public class AIService
    {
        private readonly HttpClient _client = new HttpClient();
        private string _apiUrl = "http://192.168.100.71:8000/v1/chat/completions";
        private string _model = "deepseek-r1-70b";
        private double _defaultTemperature = 0.7;

        // 保持对话历史
        private List<ChatMessage> chatHistory = new List<ChatMessage>();

        // 用于专利交底书生成的系统提示词
        private readonly string disclosureSystemPrompt = "你是一位专业的专利代理人，擅长将技术资料整理成专利交底书。请根据用户提供的技术资料，生成一份结构完整、描述清晰的专利交底书。要求：1. 严格按照标准专利交底书格式输出，包含以下部分：技术领域、背景技术、发明内容、技术方案、有益效果、附图说明、具体实施方式；2. 每个部分都要有明确的标题，标题后不要加任何符号；3. 内容要专业、准确、完整；4. 使用正式的专利文档语言；5. 如果涉及算法公式，请用中文详细描述算法的原理和步骤，不要直接使用数学符号；6. 不要输出任何[CHAIN]或<think>标记的内容；7. 直接输出完整的交底书内容，不要有任何解释或说明。";
        
        // 用于逐句润色的系统提示词
        private readonly string polishSystemPrompt = "你是一位专业的专利文档编辑专家。请对用户提供的文本进行润色，要求：1. 只输出润色后的文本，不要任何解释、说明或分析；2. 保持原意不变，只优化表达方式；3. 使用专业的专利文档语言；4. 确保语法正确、用词精准、表达流畅；5. 保持标题和正文的格式结构不变；6. 如果是对全文润色，保持原有的段落结构和标题层次；7. 不要输出任何[CHAIN]、<think>或其他标记；8. 直接输出润色结果，不要有任何额外内容。";
        
        // 用于续写的系统提示词
        private readonly string continueSystemPrompt = "你是一位专业的专利撰写专家。请根据已有内容，续写后续内容，保持风格一致、逻辑连贯。要求：1. 输出格式必须与已有内容完全一致，标题后不要加任何符号；2. 续写内容要与已有内容自然衔接，不能重复已有内容；3. 使用正式的专利文档语言，保持技术性和专业性；4. 如果涉及算法公式，请用中文详细描述算法的原理和步骤；5. 不要输出任何[CHAIN]或<think>标记的内容；6. 直接输出续写的专利内容，不要有任何解释或说明。";
        
        // 用于格式规整的系统提示词
        private readonly string formatSystemPrompt = "你是一位专业的专利文档编辑专家。请对用户提供的文本进行格式规整，将其整理成标准的专利交底书格式。要求：1. 按照标准交底书结构重新组织内容：技术领域、背景技术、发明内容、技术方案、有益效果、附图说明、具体实施方式；2. 每个部分都要有明确的标题，标题后不要加任何符号；3. 统一标点符号和段落格式；4. 保持内容的完整性和准确性；5. 使用正式的专利文档语言；6. 如果涉及算法公式，请用中文详细描述；7. 进行智能排版：合理分段、调整段落间距、优化文本布局；8. 确保标题和正文层次分明，便于阅读；9. 不要输出任何[CHAIN]或<think>标记的内容；10. 直接输出规整后的完整交底书内容。";
        
        // 用于扩写的系统提示词
        private readonly string expandSystemPrompt = "你是一位专业的专利撰写专家。请对用户提供的段落进行扩写，要求：1. 保持原段落的核心意思不变，但大幅增加内容的详细程度和深度；2. 标题后不要加任何符号；3. 扩写内容要专业、准确、详细，符合专利文档要求；4. 如果涉及算法公式，请用中文详细描述算法的原理和步骤；5. 不要输出任何[CHAIN]或<think>标记的内容；6. 直接输出扩写后的段落内容，不要有任何解释或说明；7. 扩写后的内容应该比原文更加详细和完整。";
        
        // 用于连接测试的系统提示词
        private readonly string testConnectionSystemPrompt = "你是一个连接测试服务。请简单回复'连接正常'来确认服务可用。";

        /// <summary>
        /// 默认构造函数
        /// </summary>
        public AIService()
        {
        }

        /// <summary>
        /// 带参数的构造函数
        /// </summary>
        public AIService(string apiUrl, string model, double temperature = 0.7)
        {
            _apiUrl = apiUrl;
            _model = model;
            _defaultTemperature = temperature;
        }

        /// <summary>
        /// 更新配置
        /// </summary>
        public void UpdateConfig(string apiUrl, string model, double temperature)
        {
            _apiUrl = apiUrl;
            _model = model;
            _defaultTemperature = temperature;
        }

        public async Task<string> CallAIAsync(string userInput, string function, double temperature = 0.7)
        {
            // 如果没有指定温度，使用默认温度
            if (temperature == 0.7 && function != "test_connection")
            {
                temperature = _defaultTemperature;
            }

            // 根据功能选择不同的系统提示词
            string systemPrompt = "";
            switch (function)
            {
                case "generate_disclosure":
                    systemPrompt = disclosureSystemPrompt;
                    ClearHistory(); // 生成交底书时清空历史
                    break;
                case "polish_sentence":
                    systemPrompt = polishSystemPrompt;
                    ClearHistory(); // 润色时不需要历史
                    break;
                case "continue_writing":
                    systemPrompt = continueSystemPrompt;
                    ClearHistory(); // 续写时不需要历史
                    break;
                case "format_text":
                    systemPrompt = formatSystemPrompt;
                    ClearHistory();
                    break;
                case "expand_text":
                    systemPrompt = expandSystemPrompt;
                    ClearHistory();
                    break;
                case "test_connection":
                    systemPrompt = testConnectionSystemPrompt;
                    ClearHistory();
                    break;
                default:
                    systemPrompt = "你是一位专业的专利撰写助手。";
                    break;
            }

            // 添加系统消息和用户消息
            var messages = new List<ChatMessage>
            {
                new ChatMessage { role = "system", content = systemPrompt },
                new ChatMessage { role = "user", content = userInput }
            };

            var request = new ChatRequest
            {
                model = _model,
                messages = messages,
                temperature = temperature,
                stream = false // 简化实现，不使用流式响应
            };

            try
            {
                var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
                
                // 记录请求内容，便于调试
                Console.WriteLine($"API请求: {JsonConvert.SerializeObject(request)}");
                
                var response = await _client.PostAsync(_apiUrl, content);

                response.EnsureSuccessStatusCode();
                var json = await response.Content.ReadAsStringAsync();
                
                // 记录响应内容，便于调试
                Console.WriteLine($"API响应: {json}");
                
                var data = JsonConvert.DeserializeObject<ChatResponse>(json);
                
                if (data?.choices != null && data.choices.Count > 0)
                {
                    var result = data.choices[0].message?.content ?? "";
                    
                    // 添加到历史
                    chatHistory.Add(new ChatMessage { role = "user", content = userInput });
                    chatHistory.Add(new ChatMessage { role = "assistant", content = result });
                    
                    return result;
                }
                
                return "API返回数据格式错误";
            }
            catch (Exception ex)
            {
                return $"API调用出错: {ex.Message}";
            }
        }

        public void ClearHistory()
        {
            chatHistory.Clear();
        }
    }
} 